php遍历树的常用方法汇总
一、递归的深度优先的算法:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
define('DS', DIRECTORY_SEPARATOR);
function rec_list_files($from = '.')
{
if(!is_dir($from)) {
return array();
}
$files = array();
if($dh = opendir($from))
{
while(false !== ($file = readdir($dh))) {
if($file == '.' || $file == '..') {
continue;
}
$path = $from . DS . $file;
if (is_file($path)) {
$files[] = $path;
}
$files = array_merge($files, rec_list_files($path));
}
closedir($dh);
}
return $files;
}
function profile($func, $trydir)
{
$mem1 = memory_get_usage();
echo '<pre>----------------------- Test run for '.$func.'() ';
flush();
$time_start = microtime(true);
$list = $func($trydir);
//print_r($list);
$time = microtime(true) - $time_start;
echo 'Finished : '.count($list).' files</pre>';
$mem2 = memory_get_peak_usage();
printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>',
($mem2-$mem1)/1024.0, $time);
return $list;
}
profile('rec_list_files', "D:\www\server");
?>
二、递归的深度优先的算法(用了一个栈来实现)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
define('DS', DIRECTORY_SEPARATOR);
function deep_first_list_files($from = '.')
{
if(!is_dir($from)) {
return false;
}
$files = array();
$dirs = array($from);
while(NULL !== ($dir = array_pop($dirs))) {
if( $dh = opendir($dir)) {
while( false !== ($file = readdir($dh))) {
if($file == '.' || $file == '..') {
continue;
}
$path = $dir . DS . $file;
if(is_dir($path)) {
$dirs[] = $path;
} else {
$files[] = $path;
}
}
closedir($dh);
}
}
return $files;
}
function profile($func, $trydir)
{
$mem1 = memory_get_usage();
echo '<pre>----------------------- Test run for '.$func.'() ';
flush();
$time_start = microtime(true);
$list = $func($trydir);
//print_r($list);
$time = microtime(true) - $time_start;
echo 'Finished : '.count($list).' files</pre>';
$mem2 = memory_get_peak_usage();
printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>',
($mem2-$mem1)/1024.0, $time);
return $list;
}
profile('deep_first_list_files', "D:\www\server");
?>
三、非递归的广度优先算法(用了一个队列来实现)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
define('DS', DIRECTORY_SEPARATOR);
function breadth_first_files($from = '.') {
$queue = array(rtrim($from, DS).DS);// normalize all paths
$files = array();
while($base = array_shift($queue )) {
if (($handle = opendir($base))) {
while (($child = readdir($handle)) !== false) {
if( $child == '.' || $child == '..') {
continue;
}
if (is_dir($base.$child)) {
$combined_path = $base.$child.DS;
array_push($queue, $combined_path);
} else {
$files[] = $base.$child;
}
}
closedir($handle);
} // else unable to open directory => NEXT CHILD
}
return $files; // end of tree, file not found
}
function profile($func, $trydir)
{
$mem1 = memory_get_usage();
echo '<pre>----------------------- Test run for '.$func.'() ';
flush();
$time_start = microtime(true);
$list = $func($trydir);
//print_r($list);
$time = microtime(true) - $time_start;
echo 'Finished : '.count($list).' files</pre>';
$mem2 = memory_get_peak_usage();
printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>',
($mem2-$mem1)/1024.0, $time);
return $list;
}
profile('breadth_first_files', "D:\www\server");
?>
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/php/10899.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
9. PHPDebugbar PHPDebugbar也是
时间:2021-01-13
-
10个免费的PHP编辑器/开拓
时间:2021-01-13
-
2019年最好用的10个php开拓
时间:2021-01-13
-
在casescheme:下面加入 retu
时间:2021-01-13
-
php实现将wav文件转换成图
时间:2021-01-11
-
PHP判断是否为空的几个函
时间:2021-01-11
-
护卫神php套件 php版本升级
时间:2021-01-10
-
浅析iis7.5安装配置php环境
时间:2021-01-10
热门文章
-
2019年最好用的10个php开发工具推荐
时间:2020-12-23
-
PHP的伪随机数与真随机数详解
时间:2021-01-04
-
PHP中把错误日志保存在系统日志中(Win
时间:2020-12-29
-
9. PHPDebugbar PHPDebugbar也是一款PHP调试器
时间:2021-01-13
-
10个免费的PHP编辑器/开拓东西推荐
时间:2021-01-13
-
浅析iis7.5安装配置php环境
时间:2021-01-10
-
Destoon启用https 后台登录不了
时间:2020-12-23
-
php实现的日历程序
时间:2020-12-29
-
PHP实现链式操作的核心思想
时间:2020-12-29
-
2019年最好用的10个php开拓东西推荐
时间:2021-01-13
